[vb 2010 express] creare una tabella excel



  • [vb 2010 express] creare una tabella excel
    di Delp data: 04/02/2011

    Salve a tutti!
    sono riuscito dopo vari tentativi a importare in excel dei files di testo. ora, in un altro foglio ho inserito una tabella vuota dove nelle colonne sono presenti tutti gli elementi chimici(h,he,...u), mentre per ogni riga vi è misura 1, misura 2,...misura 40.i file di testo importati sono dei report di analisi dove compaiono alcuni di questi elementi con le relative concentrazioni. vorrei realizzare un'applicazione con visual basic 2010 express che mi consenta di inserire ad es. la concentrazione del carbonio, ossigeno, etc del primo report nella riga "misura 1" in corrispondenza della colonna dell'elemento considerato. analogamente, per il secondo report, nella riga misura 2 e così via per tutti gli altri(non c'è un numero fisso, ma vorrei impostare l'applicazione per un max di 40 report). il problema è che non so come organizzare il tutto e, soprattutto, non so se esiste qualche funzione che mi possa agevolare nella redazione del codice. sono alle prime armi e, se avete qualche consiglio e qualche esempio di codice(soprattutto), vi sarei molto grato!!!
    grazie.



  • di Mik (utente non iscritto) data: 05/02/2011

    Ciao

    prima una curiosità: perché hai usato vb 2010...? per importare i report?

    comunque si può fare sicuramente con macro. magari se alleghi il file di excel per capire meglio la formattazione dei report e della tabella che vuoi popolare!





  • di Delp data: 05/02/2011

    Ciao mik,
    grazie per l'aiuto.
    allora, ho allegato la tabella excel finale e un report in .txt.
    quanto alla domanda che mi hai fatto, ho usato vb2010 perchè, da principiante assoluto, pensavo fosse la scelta migliore.
    grazie.



  • di Mik (utente non iscritto) data: 05/02/2011

    Ti ho allegato il file di excel bello e pronto.

    ti ho messo un bottone nel foglio della tabella. prima, seleziona un'intera riga (basta cliccare sul margine sinistro della riga) ove vuoi che i valori si inseriscano. si attiva il bottone, cliccandoci si apre una finestra di dialogo per selezionare il file di report..il gioco è fatto.

    ps. non avendomi passato il tuo file excel di import, ho provveduto a implementare la lettura dei valori direttamente dal file (che selezionerai per ogni nuova importazione..)
    testato con il file report che mi hai passato..
    cerca di fare altri test con tutti i file di report (non dovrebbe cambiare la formattazione che è sempre quella, ma non si sa mai)

    fammi sapere

    ciao



  • di Delp (utente non iscritto) data: 06/02/2011

    Ciao mik e grazie per tuo aiuto.
    sono un novizio di vb 2010 e di forum e mi devi scusare se non ti ho inviato i file nel modo giusto e, soprattutto, se non mi sono spiegato al meglio. cercherò di farlo ora: ho realizzato una form con un solo button (per il momento, poi aggiungerò listbox e progress bar)che mi consente di aprire una finestra di dialogo apri da dove carico in excel i files di testo. i report, quindi vengono aperti (uno per ogni foglio) nel file "elaborato excel". qui mi sono fermato, e proprio da qui dovrei dare istruzioni per popolare la tabella.

    non vorrei abusare della tua pazienza e dalla tua cortesia.... se vuoi, puoi anche indicarmi le funzioni da utilizzare (es. per cercare i dati usa la funzione a, per copiarli usa la funzione b etc.). il tuo foglio comunque funziona benissimo, anche se vorrei automatizzare al massimo le operazioni.
    per evitare ulteriori omissioni da parte mia, ti posto il codice e inserisco il file excel che risulta dalle istruzioni del codice (dove mi sono fermato).
    di nuovo grazie infinite.
     
    Imports Microsoft.Office.Interop
    Imports Microsoft.Office.Core
    Imports System.Net
    Imports System.IO
    Imports System.Collections.ObjectModel
    Imports Microsoft.Office.Interop.Excel
    
    
    Public Class Form1
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            
            Dim S() As String = OpenFileDialog1.FileNames
            Dim File As String
            Dim objXls As Microsoft.Office.Interop.Excel.Application
            
    
            objXls = New Microsoft.Office.Interop.Excel.Application
            objXls.Visible = True
            objXls.Workbooks.Open("C:UsersAndreaDesktopElaborato Excel.xls")
    
            If OpenFileDialog1.ShowDialog = System.Windows.Forms.DialogResult.OK Then
    
            End If
            For Each File In OpenFileDialog1.FileNames
    
                With (objXls)
     
                    .DisplayAlerts = False
                    .Windows("Elaborato Excel.xls").Activate()
                    .Worksheets.Add()
                    .Workbooks.OpenText(Filename:=File, _
                            Origin:=XlPlatform.xlWindows, _
                            StartRow:=1, _
                            DataType:=Excel.XlTextParsingType.xlDelimited, _
                            TextQualifier:=Excel.XlTextQualifier.xlTextQualifierDoubleQuote, _
                            ConsecutiveDelimiter:=False, _
                            Tab:=True, _
                            Semicolon:=False, _
                            Comma:=False, _
                            Space:=False, _
                            Other:=False)
                    .Cells.Copy()
                    .ActiveWorkbook.Close()
                    .Windows("Elaborato Excel.xls").Activate()
                    .Selection.PasteSpecial()
    
                End With
            Next File
            Dim I As Integer
            With (objXls)
                .Sheets("Foglio1").Activate()
                For I = 1 To .ActiveWorkbook.Sheets.Count - 1
                    .Application.Sheets("Foglio" & I).Name = "Misura" & I
                Next
            End With
        End Sub
    
    End Class



  • di Mik (utente non iscritto) data: 06/02/2011

    Allora non sono sicuro solo di una cosa... vuoi fare tutto tramite visual studio 10?? quindi usare il file "elaborato excel.xls" solo come report?
    ti è necessario caricare i report così come sono nel foglio di excel per poi elaborarli ulteriormente dopo? (diveterebbe troppo laborioso e poco efficente a parer mio )

    se no.. va bene il codice che ti ho passato...
    modificando solo parte del codice residente in commandbutton1_click() si ottengono lo stesso i risultati voluti..

    esempio: abilitando il multiselect nella finestra di dialogo

    allowmultiselect = true

    e inserendo un ciclo che carica tutti i file selezionati:

    for i = 1 to .selecteditems.count
    caricafilereport (.selecteditems(i))
    rows(selection.row + 1).select '<< --- sposta la selezione di una riga come segna posto per il prossimo inserimento dei valori
    next i

    questo è tutto il codice con la piccola modifica integrata:
     
    Private Sub CommandButton1_Click()
        Dim dlgOpen As FileDialog
        
        If Selection.Columns.Count <> Columns.Count Or Selection.Rows.Count <> 1 Or _
            Selection.Row <= 1 Or Selection.Row > Rows.Count Then
                CommandButton1.Enabled = False
                MsgBox "Bisogna proma selezionare l'intera riga ove aggiungere i dati", vbExclamation, "Importante"
                Exit Sub
        End If
        
        Set dlgOpen = Application.FileDialog( _
            FileDialogType:=msoFileDialogFilePicker)
        With dlgOpen
            .InitialFileName = ThisWorkbook.Path + "
    eport.txt"
            .Filters.Clear
            .Filters.Add "Report", "*.txt"
            .AllowMultiSelect = True
            If .Show = -1 Then
                For i = 1 To .SelectedItems.Count
                        CaricaFileReport (.SelectedItems(i))
                        Rows(Selection.Row + 1).Select
                Next i
            End If
            Rows(Selection.Row).Select
        End With
    End Sub
    



  • di Delp (utente non iscritto) data: 06/02/2011

    Ciao mik,
    volevo rispondere alle tue domande:
    1)la mia intenzione era di fare tutte le operazioni con visual studio 2010.
    2)avevo importato i files report nel file "elaborato excel" perchè pensavo fosse più facile incolonnare le concentrazioni dei vari elementi, piuttosto che caricarli direttamente da files esterni. se quest'ultima soluzione è più vantaggiosa a me va benissimo così..
    3) il foglio "elaborato excel" è un foglio finale che io poi copierò e incollerò su un documento word insieme alle foto dei campioni..

    un'ultima cosa: incollando in vb 2010 il codice da te inviato è comparso un errore in riferimento alla riga (e anche ad altre righe)
    if len(trim(m(0, r))) > 0 then
    sottolineando (0,r).l'errore è descritto così:il numero di indici è superiore al numero di dimensioni della matrice indicizzata. cioè??

    grazie!!



  • di Mik (utente non iscritto) data: 06/02/2011

    Perchè in vs10 funziona che secondo lui quella matrice non ha dimenzioni in base a come è stata dichiarata:
    dim m() as stringa

    lui esegue un controllo di precompilazione e non tiene conto delle dichiarazioni (dim o redim) presenti dentro istruzioni condizionali, come nel caso "if then else"

    infatti mi sembra che ha sottolineato per far notare al programmatore dell'eventuale circostanza (nella sottolineatura non c'è trattino rosso?). non si tratta di un errore quindi l'esecuzione avverrà comunque



  • di Mik (utente non iscritto) data: 06/02/2011

    Ahhh..
    comunque quella routine l'ho implementata sotto vba di excel 2010. con qualche piccola modifica di adattamento (oppure semplimecemnte com'è... non ne sono sicuro) si riesce a farla girare su vs10??!! stai usando il framework di office su vs10?
    non l'ho ancora provato, ma vedo che riesci a iteragire facilmente con i documenti e fogli di excel..come fossi in ambiente vba


  • Trasposizione routine a vb10
    di Mik (utente non iscritto) data: 07/02/2011

    Ciao delp,

    effettivamente dopo aver fatto una prova a incollare il codice in ambiente vb10... come al solito, la gestione e ridimenzionamento delle matrici multidimenzionali è rimasto sempre un problema critico di quell'ambiente (in questo caso migliore in vba)

    però in vb10 tra le tante cose che troviamo in più, c'è un potente strumento chiamato 'collections.arraylist'
    è sempre una conformazione di una matrice ma che risulta assai dinamica rispetto alla semplice matrice.. in fatti ho implentato l'arraylist al posto della vecchia matrice ed il risultato è stato ottimo...

    questo è tutto il codice:

    ps.: ho testato solo la prima parte relativa alla lettura dei valori dal file è va una meraviglia.
    mentre la seconda parte( relativa ll'inserimento nel folgio di excel), non avendo ancora provato lo strumento office, non ho potuto testarlo (non so se i riferimenti alle celle del foglio possano andare bene così come sono) ma qua sicuramente saprai cavartela meglio di me..


    ciao
     
        Sub CaricaFileReport(ByVal File As String)
            Dim Riga As String, M As New Collections.ArrayList
            Dim R As Long, C As Long, NomeColonna As String, NumColonna As Long, Inizio As Long
    
            NomeColonna = "Conc"  '<<----Specificare qua il nome della colonna che contiene i valori da estrarre
            NumColonna = -1
            '*****************************************************************
            'lettura file e salva i valori  in arraylist (M)
            FileOpen(1, File, OpenMode.Input)
            Do While Not EOF(1)
                Riga = LineInput(1)
                If Len(Trim(Riga)) > 0 Then
                    R = M.Add(Split(Riga, vbTab))
                    For C = 0 To UBound(M(R))
                        If M(R)(C) = NomeColonna Then NumColonna = C : Inizio = R + 1
                        If Trim(LCase(M(R)(C))) = "total" Then Exit Do
                    Next C
                End If
            Loop
            FileClose(1)
    
            If NumColonna < 0 Then 'caso la colonna interessata non sia presente nel file, quindi termina..
                MsgBox("Colonna  '" + NomeColonna + "'  non è stata trovata nel file report:" + _
                    vbCr + "'" + File + "'." + vbCr + vbCr + "Controllare che il nome della colonna da analizzare sia corretto", vbCritical, "ATTENZIONE!")
                Exit Sub
            End If
            '*********************************************************************
            'Inserimento valori nel foglio della tabella preformattata in excel
            For R = Inizio To M.Count - 1
                If Len(Trim(M(R)(0))) > 0 Then
                    For C = 2 To Columns.Count
                        If Len(Trim(Cells(1, C))) = 0 Then 'controllo opzionale:se l'elemento non esiste nella tabella chiede di aggiungerlo automaticamente
                            If MsgBox("Elemento:   ' " + M(R)(0) + " '   non esiste nella tabella-foglio di excel..." + vbCr + vbCr + _
                                    "Si vuole aggiungere adesso questo nuovo elemento alla tabella?", vbYesNo, "File corrente: '" + File + "'") = vbYes Then
                                Cells(1, i) = M(R)(0)
                                Cells(Selection.Row, C) = M(R)(NumColonna)
                            End If
                            Exit For
    
                        ElseIf Trim(Cells(1, C)) = Trim(M(R)(0)) Then
                            Cells(Selection.Row, C) = M(R)(NumColonna)
                            Exit For
                        End If
                    Next C
                End If
            Next R
        End Sub
    



  • di Delp data: 07/02/2011

    Rieccomi qua...
    allora ho copiato il codice che mi hai gentilmente scritto in vb10. sono comparsi alcuni errori che ho eliminato in questo modo:
    1)cells e columns(sottolineate in blu con trattino rosso): ho inserito with excel e digitato un . prima
    2).cells(1, i) = m(r)(0) : "i" non dichiarato ==> dim i as long
    3).cells(selection.row, c): ho cambiato in row.selection.

    il problema è che non so come far partire il debug visto che non c'è un button nel codice.. ho provato ad inserirlo ma non ne esco con gli errori... perdona la mia ignoranza,ma come hai fatto a testare la prima parte?



  • di Mik (utente non iscritto) data: 07/02/2011

    ..perdonami...fortuna che me l'hai fatto notare adesso...sostituisci alla 'i' con la 'c'.. mi è sfuggito mentre adattavo il codice a manina per vb10 (tutte le 'i' le ho rimpiazzete con la 'c')

    l'ho testata lanciandola semplicemente dalla finestra di debug (finestra immediata), così:

    call caricafilereport("...percorso e nome file report..")

    magari inserisci prima l'istruzione 'stop' come prima riga della routine, così fai il debug passo passo

    non dimenticare che nel codice del bottone devi mettere quell'altra routine che apre filedialog e poi lancia questa routine!



  • di Delp data: 09/02/2011

    Ciao mik,
    in questi giorni ho dato un'occhiata ad un po' di teoria(soprattutto le matrici, anche se è un argomento un po' ostico)... cercando di capire quanto avevi scritto. non ha infatti senso(secondo me) copiare e incollare senza sapere quello che si fa...
    comunque,nel codice sotto riportato e scritto da te ho fatto alcune aggiunte e modifiche (per aggirare alcuni errori che si venivano a creare).spero siano giuste.
    ti segnalo inoltre un errore che si evidenzia nella riga:
    if len(trim(.cells(1, c))) = 0 then, dove l'errore dice:invalidcastexception non è stata gestita: cast non valido dal tipo 'range' al tipo 'string'.
    nota: come puoi vedere dal codice, ho inserito anche un'istruzione per far aprire il file con la tabella già formattata(.workbooks.open ("elaborato excel")).senza questa riga, il debug si fermava alla riga precedente.
    qualche suggerimento?

    grazie!
     
    Imports System.Net
    Imports System.IO
    Imports System.Collections.ObjectModel
    Imports System.Data
    
    
    Public Class Form1
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            If OpenFileDialog1.ShowDialog = System.Windows.Forms.DialogResult.OK Then
    
    
            End If
            Dim File = OpenFileDialog1.FileName
            Dim Riga As String, M As New Collections.ArrayList
            Dim R As Long, C As Long, NomeColonna As String, NumColonna As Long, Inizio As Long
    
            NomeColonna = "Conc"  '<<----Specificare qua il nome della colonna che contiene i valori da estrarre
            NumColonna = -1
            '*****************************************************************
            'lettura file e salva i valori  in arraylist (M)
            FileOpen(1, File, OpenMode.Input)
            Do While Not EOF(1)
                Riga = LineInput(1)
                If Len(Trim(Riga)) > 0 Then
                    R = M.Add(Split(Riga, vbTab))
                    For C = 0 To UBound(M(R))
                        If M(R)(C) = NomeColonna Then NumColonna = C : Inizio = R + 1
                        If Trim(LCase(M(R)(C))) = "total" Then Exit Do
                    Next C
                End If
            Loop
            FileClose(1)
    
            If NumColonna < 0 Then 'caso la colonna interessata non sia presente nel file, quindi termina..
                MsgBox("Colonna  '" + NomeColonna + "'  non è stata trovata nel file report:" + _
                    vbCr + "'" + File + "'." + vbCr + vbCr + "Controllare che il nome della colonna da analizzare sia corretto", vbCritical, "ATTENZIONE!")
    
            End If
            '*********************************************************************
            'Inserimento valori nel foglio della tabella preformattata in excel
            Dim objXls As Microsoft.Office.Interop.Excel.Application
            objXls = New Microsoft.Office.Interop.Excel.Application
            objXls.Visible = True
    
            With objXls
                .Workbooks.Open("C:UsersAndreaDesktopElaborato Excel.xls")
                For R = Inizio To M.Count - 1
                    If Len(Trim(M(R)(0))) > 0 Then
                        For C = 2 To .Columns.Count
                            If Len(Trim(.Cells(1, C))) = 0 Then 'controllo opzionale:se l'elemento non esiste nella tabella chiede di aggiungerlo automaticamente
                                If MsgBox("Elemento:   ' " + M(R)(0) + " '   non esiste nella tabella-foglio di excel..." + vbCr + vbCr + _
                                        "Si vuole aggiungere adesso questo nuovo elemento alla tabella?", vbYesNo, "File corrente: '" + File + "'") = vbYes Then
                                    .Cells(1, C) = M(R)(0)
                                    .Cells(.Row.Selection, C) = M(R)(NumColonna)
                                End If
                                Exit For
    
                            ElseIf Trim(.Cells(1, C)) = Trim(M(R)(0)) Then
                                .Cells(.Row.Selection, C) = M(R)(NumColonna)
                                Exit For
                            End If
                        Next C
                    End If
                Next R
            End With
    
    
        End Sub
    End Class
    



  • di Mik (utente non iscritto) data: 10/02/2011

    Ecco è come immaginavo:
    cell() in vba restituisce il valore contenuto nella cella, mentre in v.b. restituisce l'oggetto completo "range" della cella...ecco perchè da quell'errore. trim si aspetta un tipo stringa..
    di norma in v.b. per avere il valore di un oggetto , basta aggiungere .value...esempio
    len(trim(.cells(1, c).value))
    per non sbagliare il tipo di valore restituito aggiungo .tostring, così siam sicuri che esce fuori un valore tipo stringa:
    prova così...
    len(trim(.cells(1, c).value.tostring))

    debbo dire però rimane un altro problema più avanti nel codice: il riferimento alla riga lo prende con selection.row, e quindi non va bene se ad esempio nel foglio di excel non vi è alcuna riga selezionata..non ha un riferimento certo. bisogna trovare un modo per dargli questo riferimento in un altra maniera...per adesso (giusto per fare i test) ci metti il riferimento alla riga 2 (corrisponde alla prima riga utile nella tabella)

    ciao a presto



  • di Delp data: 16/02/2011

    Ciao mik,
    ho trovato le istruzioni per selezionare la riga 2 come mi avevi detto e inoltre anche per selezionare la riga successiva così da mandare il tutto in automatico. mi incolla però solo i valori del primo file.. forse sbaglio nel collocare le istruzioni all'interno del codice? ti posto il codice(solo l'ultima parte)... grazie infinite!
     
    'Inserimento valori nel foglio della tabella preformattata in excel
            Dim objXls As Microsoft.Office.Interop.Excel.Application
            objXls = New Microsoft.Office.Interop.Excel.Application
            objXls.Visible = True
    
            With objXls
                .Workbooks.Open("C:UsersAndreaDesktopElaborato Excel.xls")
                For R = Inizio To M.Count - 1
                    If Len(Trim(M(R)(0))) > 0 Then
                        For C = 2 To .Columns.Count
                            If Len(Trim(.Cells(1, C).value.ToString)) = 0 Then 'controllo opzionale:se l'elemento non esiste nella tabella chiede di aggiungerlo automaticamente
                                If MsgBox("Elemento:   ' " + M(R)(0) + " '   non esiste nella tabella-foglio di excel..." + vbCr + vbCr + _
                                        "Si vuole aggiungere adesso questo nuovo elemento alla tabella?", vbYesNo, "File corrente: '" + File + "'") = vbYes Then
                                    .Cells(1, C) = M(R)(0)
                                    .Cells(.Rows.Selection, C) = M(R)(NumColonna)
                                End If
                                Exit For
                            ElseIf Trim(.Cells(1, C).Value.ToString) = Trim(M(R)(0)) Then
                                .Cells.Rows("2").Select()   'Seleziono la riga 2
                                .Cells(.ActiveCell.Row, C) = M(R)(NumColonna)
                                Exit For
                            End If
                        Next C
                    End If
                Next R
                .ActiveCell.Offset(1, 0).Select()    'Seleziono la cella sottostante alla riga 2
                .ActiveCell.EntireRow.Select()        'Seleziono l'intera riga
            End With
    
    
        End Sub
    End Class



  • di Mik (utente non iscritto) data: 17/02/2011

    Ciao delp

    si ok,
    1.se lasci il 2 come riga, inserisce sempre in quella riga (era giusto per provare il codice e sembra che hai risolto quel problema).
    2. per far iteragire più file devi creare un ciclo e abilitare prima la finestra di dialogo alla proprietà 'multiselect' (come avevo fatto io inizialmente con vba)
    3. per la finestra di dialogo openfile, non capisco perchè tu abbia posto il controllo e poi comunque esegue tutto il codice:

    if openfiledialog1.showdialog = system.windows.forms.dialogresult.ok then


    end if
    ......
    ...... ' <----- codice
    .......



    * allora per prima cosa ti do un suggerimento per stabilire la riga di inserimento (dimmi tu se ti va bene):
    1) dopo aver aperto il folgio di excel, bisogna controllare: se nel foglio non vi è alcuna riga selezionata, allora l'iserimento parte dalla 1^ riga utile (riga n°2), altrimenti inizia dalla riga selezionata:

    dim riga as long=2 ' dichiara e imposta la posizione sulla prima riga utile: n°2

    if .selection.rows.count>0 then riga=.selection.row ' se vi è almeno una riga selezionata , allora utilizza la riga selezionata come posizione d'inserimento.

    .row(riga).select ' riseleziona l'intera riga di riferimento


    2) abilitare la finestra di dialogo per il multiselect:

    openfiledialog1.multiselect=true

    dopo di chè, aprire la finestra di dialogo compreso di controllo :

    if openfiledialog1.showdialog = system.windows.forms.dialogresult.ok then

    ' apri adesso il file di excel
    ' inserisci qua l'inizializzazione della riga (punto 1)


    adesso, bisogna inizializzare un ciclo per tutti i file selezionati:

    for each file as string in filedialog1.filenames

    riga=.selection.row ' prende il riferimento riga dalla riga selezionata

    ......
    ..... 'esegue tutto il codice
    ......


    a fine codice aggiungi questi comandi:

    .row(selection.row + 1).select ' quindi avanza la selezione di una riga (utile all'eventuale prossimo ciclo d'inserimento)(può andare bene anche quello postato da te)

    next file ' cicla il prossimo file

    end if ' questo è il fine di 'if then ' della finestra di dialogo


    ora rimane da sostituire nel codice i due comandi di riferimento riga con la variabile riga, così:

    .cells(riga, c) = m(r)(numcolonna)

    ps1. se non sono stato chiaro o hai problemi con le modifiche , posta tutto il codice che le inserisco io.

    ps2. mi stai invogliando a passare i miei progetti di vba su visual studio 2010



  • di Delp data: 17/02/2011

    Ciao mik e grazie per l'aiuto. allora, ho inserito le istruzioni che mi hai suggerito e sono riuscito ad automatizzare il tutto , ma mi inserisce sempre lo stesso file!!
    cioè, se seleziono 5 files nella finestra "apri" mi apre il n.1 per cinque volte... dovrebbe essere una cavolata, ma non so di preciso cosa modificare!
    comunque ti posto il codice come d'accordo.
    ciao e grazie di nuovo!
     
    Imports System.Net
    Imports System.IO
    Imports System.Collections.ObjectModel
    Imports System.Data
    
    
    Public Class Form1
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            If OpenFileDialog1.ShowDialog = System.Windows.Forms.DialogResult.OK Then
    
    
    
                Dim File As String = OpenFileDialog1.FileName
                Dim Riga As String, M As New Collections.ArrayList
                Dim R As Long, C As Long, NomeColonna As String, NumColonna As Long, Inizio As Long, Misura As Long = 2
    
                NomeColonna = "Conc"  '<<----Specificare qua il nome della colonna che contiene i valori da estrarre
                NumColonna = -1
                '*****************************************************************
                'lettura file e salva i valori  in arraylist (M)
                FileOpen(1, File, OpenMode.Input)
                Do While Not EOF(1)
                    Riga = LineInput(1)
                    If Len(Trim(Riga)) > 0 Then
                        R = M.Add(Split(Riga, vbTab))
                        For C = 0 To UBound(M(R))
                            If M(R)(C) = NomeColonna Then NumColonna = C : Inizio = R + 1
                            If Trim(LCase(M(R)(C))) = "total" Then Exit Do
                        Next C
                    End If
                Loop
                FileClose(1)
    
                If NumColonna < 0 Then 'caso la colonna interessata non sia presente nel file, quindi termina..
                    MsgBox("Colonna  '" + NomeColonna + "'  non è stata trovata nel file report:" + _
                        vbCr + "'" + File + "'." + vbCr + vbCr + "Controllare che il nome della colonna da analizzare sia corretto", vbCritical, "ATTENZIONE!")
    
                End If
                '*********************************************************************
                'Inserimento valori nel foglio della tabella preformattata in excel
                Dim objXls As Microsoft.Office.Interop.Excel.Application
                objXls = New Microsoft.Office.Interop.Excel.Application
                objXls.Visible = True
    
                With objXls
    
                    .Workbooks.Open("C:UsersAndreaDesktopElaborato Excel.xls")
    
                    If .Selection.Rows.Count > 0 Then
                        Misura = .Selection.Row ' se vi è almeno una riga selezionata , allora utilizza la riga selezionata come posizione d'inserimento. 
                        .Rows(Misura).Select() ' riseleziona l'intera riga di riferimento 
                        .ActiveCell.Offset(1, 0).Select()
                        .ActiveCell.EntireRow.Select()
                    End If
                    For Each File In OpenFileDialog1.FileNames
    
                        Misura = .Selection.Row ' prende il riferimento riga dalla riga selezionata 
    
                        For R = Inizio To M.Count - 1
                            If Len(Trim(M(R)(0))) > 0 Then
                                For C = 2 To .Columns.Count
                                    If Len(Trim(.Cells(1, C).value.ToString)) = 0 Then 'controllo opzionale:se l'elemento non esiste nella tabella chiede di aggiungerlo automaticamente
                                        If MsgBox("Elemento:   ' " + M(R)(0) + " '   non esiste nella tabella-foglio di excel..." + vbCr + vbCr + _
                                                "Si vuole aggiungere adesso questo nuovo elemento alla tabella?", vbYesNo, "File corrente: '" + File + "'") = vbYes Then
                                            .Cells(1, C) = M(R)(0)
                                            .Cells(Misura, C) = M(R)(NumColonna)
                                        End If
                                        Exit For
                                    ElseIf Trim(.Cells(1, C).Value.ToString) = Trim(M(R)(0)) Then
    
                                        .Cells(Misura, C) = M(R)(NumColonna)
    
                                        Exit For
    
                                    End If
    
                                Next C
    
                            End If
    
                        Next R
                        .ActiveCell.Offset(1, 0).Select()
                        .ActiveCell.EntireRow.Select()
                    Next File
    
    
                                End With
            End If
    
        End Sub
    End Class



  • di Mik (utente non iscritto) data: 17/02/2011

    per forza... il ciclo deve comprendere anche la lettura dei dati dal file ....
    ti ho spostato il ciclo assieme alla dichiarazione delle variabili....e aggiunto l'azzeremento di alcune variabili a ogni ciclo...

    il codice l'ho diviso in due post..il sito dice che è troppo grande
     
    Imports System.Net
    Imports System.IO
    Imports System.Collections.ObjectModel
    Imports System.Data
    
    
    Public Class Form1
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    		
            If OpenFileDialog1.ShowDialog = System.Windows.Forms.DialogResult.OK Then
    
    			Dim objXls As Microsoft.Office.Interop.Excel.Application
                objXls = New Microsoft.Office.Interop.Excel.Application
                objXls.Visible = True
                With objXls
                    .Workbooks.Open("D:UsersMikDocumentsElaborato Excel.xls")
    
                    Dim Riga As String, M As New Collections.ArrayList
                    Dim R As Long, C As Long, NomeColonna As String, NumColonna As Long, Inizio As Long, Misura As Long = 2
                    NomeColonna = "Conc"  '<<----Specificare qua il nome della colonna che contiene i valori da estrarre
    
                    If .Selection.Rows.Count > 0 Then
                        Misura = .Selection.Row ' se vi è almeno una riga selezionata , allora utilizza la riga selezionata come posizione d'inserimento. 
                    End If
                    .Rows(Misura).Select() ' riseleziona l'intera riga di riferimento 
    
                    For Each File In OpenFileDialog1.FileNames
    
                        Misura = .Selection.Row ' prende il riferimento riga dalla riga selezionata 
    
                        NumColonna = -1 : Inizio = 0 : M.Clear() ' queste variabili vengono azzerate per ogni nuovo ciclo


  • ...segue
    di Mik (utente non iscritto) data: 17/02/2011

    .
     
                        '*****************************************************************
                        'lettura file e salva i valori  in arraylist (M)
                        FileOpen(1, File, OpenMode.Input)
                        Do While Not EOF(1)
                            Riga = LineInput(1)
                            If Len(Trim(Riga)) > 0 Then
                                R = M.Add(Split(Riga, vbTab))
                                For C = 0 To UBound(M(R))
                                    If M(R)(C) = NomeColonna Then NumColonna = C : Inizio = R + 1
                                    If Trim(LCase(M(R)(C))) = "total" Then Exit Do
                                Next C
                            End If
                        Loop
                        FileClose(1)
    
                        If NumColonna < 0 Then 'caso la colonna interessata non sia presente nel file, quindi termina..
                            MsgBox("Colonna  '" + NomeColonna + "'  non è stata trovata nel file report:" + _
                                vbCr + "'" + File + "'." + vbCr + vbCr + "Controllare che il nome della colonna da analizzare sia corretto", vbCritical, "ATTENZIONE!")
                        End If
                        '*********************************************************************
                        'Inserimento valori nel foglio della tabella preformattata in excel
    
                        For R = Inizio To M.Count - 1
                            If Len(Trim(M(R)(0))) > 0 Then
                                For C = 2 To .Columns.Count
                                    If Len(Trim(.Cells(1, C).value.ToString)) = 0 Then 'controllo opzionale:se l'elemento non esiste nella tabella chiede di aggiungerlo automaticamente
                                        If MsgBox("Elemento:   ' " + M(R)(0) + " '   non esiste nella tabella-foglio di excel..." + vbCr + vbCr + _
                                                "Si vuole aggiungere adesso questo nuovo elemento alla tabella?", vbYesNo, "File corrente: '" + File + "'") = vbYes Then
                                            .Cells(1, C) = M(R)(0)
                                            .Cells(Misura, C) = M(R)(NumColonna)
                                        End If
                                        Exit For
                                    ElseIf Trim(.Cells(1, C).Value.ToString) = Trim(M(R)(0)) Then
    
                                        .Cells(Misura, C) = M(R)(NumColonna)
                                        Exit For
                                    End If
                                Next C
                            End If
                        Next R
                        .ActiveCell.Offset(1, 0).Select()
                        .ActiveCell.EntireRow.Select()
                    Next File
                End With
            End If
        End Sub
    End Class



  • di Mik (utente non iscritto) data: 18/02/2011

    Adesso dimmi una cosa tu...

    stai usando visual stuido 2010 o solo visual basic 2010?

    ho provato a incollare il codice in visual studio 2010 (windows forms con visual basic) ma mi dice che le librerie di office non esistono...mi daresti una dritta? sarebbe la prima volta che adopererei office in vs2010 e ho intenzioni di passare tutti i progetti su di esso!



  • di Delp (utente non iscritto) data: 20/02/2011

    Ciao mick, ti scrivo non appena ho letto la tua risposta..
    allora, io sto usando visual basic 2010 express che puoi scaricare dal sito www.microsoft.com/express/downloads/#2010-visual-basic.
    dopo circa 10 giorni dall'istallazione, ti verrà richiesta una registrazione e il programma ti sarà concesso in licenza (praticamente è free).
    per inserire le librerie, dalla barra dei menù, vai su progetto, aggiungi riferimento, (linguetta) com e scegli la libreria (es. microsoft excel 12.0 object library).
    visual basic 2010 è a mio avviso molto intuitivo nella costruzione della userform e, attraverso la compilazione automatica, nella redazione del codice. di contro non si trovano molti post nei forum, quindi ci si deve adattare. ma questo è prevalentemente un problema per coloro che sono alle prime armi come me!!
    dopo i tanti consigli che mi hai dato, spero di esserti stato utile...
    ti farò sapere per il codice che mi hai mandato. intanto grazie infinite!!!
    ps dimenticavo... se può esserti utile, uso office 2007.



  • di Mik (utente non iscritto) data: 21/02/2011

    Grazie, trovato il riferimento 'microdoft.office.interop:excel'

    ho subito provato il codice è funge correttamente...ho notato però che le operazioni sul foglio excel sono più lente che farle direttamente da excel..e dal mio netbook si nota tantissimo la differenza non so, prima di passare tutto farò delle altre prove..

    ciao



  • di Mik (utente non iscritto) data: 22/02/2011

    Ciao delp, ho fatto altre prove ora che ho trovato lo strumento office e sono riuscito a velocizzare il tutto .. la lentezza che lamentavo, era dovuta al fatto che per ogni singolo elemento aggiunto al foglio, comportava una scansione della prima riga affinchè trovi la posizione d'inserimento del rispettivo elemento... quindi a priori gli ho fatto creare un array contenente tutti gli elemneti della prima riga , utile per una + veloce ricerca dell'elemento..

    se interessa ti posto il codice:

    rispetto al precedente ho aggiunto il punto 1)
    e sostituito il punto 2) con un array.
    poi ho tradotto alcune istruzioni al linguaggio .net di vb10

    ora si che è velocossimo..

    ps. come al solito il codice l'ho diviso in due post e ho dovuto stituire le 'e' commerciali con il segno '+'
     
    Imports System.Net
    Imports System.IO
    Imports System.Collections.ObjectModel
    Imports Microsoft.Office.Interop.Excel
    
    
    Public Class Form1
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim OpenFileDialog1 As New OpenFileDialog
            OpenFileDialog1.Multiselect = True
            If OpenFileDialog1.ShowDialog = System.Windows.Forms.DialogResult.OK Then
    
                Dim objXls As Microsoft.Office.Interop.Excel.Application
                objXls = New Microsoft.Office.Interop.Excel.Application
                objXls.Visible = True
                With objXls
                    .Workbooks.Open("D:UsersMikDocumentsElaborato Excel.xls")
    
                    Dim Riga As String = Nothing, M As New Collections.ArrayList, R As Long, NumColonna As Long, Inizio As Long
                    Dim C As Long = 2, Misura As Long = 2
                    Dim NomeColonna As String = "Conc"  '<<----Specificare qua il nome della colonna che contiene i valori da estrarre
    
                    '1)------ crea un vettore contenente tutti gli elementi presenti nella riga 1 del foglio di excel --------------
                    Do Until String.IsNullOrEmpty(.Cells(1, C).value)
                        If Not IsNothing(Riga) Then Riga += ";"
                        Riga += .Cells(1, C).value
                        C += 1
                    Loop
                    Dim Tabella() As String = Split(Riga, ";")
                    '------------------------------------------------------------------------------------------------------
                    ' se vi è almeno un'intera riga selezionata e > 1, allora utilizza la riga selezionata come posizione d'inserimento. 
                    If (.Selection.columns.count = .Columns.Count) And .Selection.Rows.Count > 1 Then Misura = .Selection.Row
                    .Rows(Misura).Select() ' riseleziona l'intera riga di riferimento 
    



  • di Mik (utente non iscritto) data: 22/02/2011

    .
     
                    For Each File In OpenFileDialog1.FileNames
                        Misura = .Selection.Row ' prende il riferimento riga dalla riga selezionata 
    
                        NumColonna = -1 : Inizio = 0 : M.Clear() ' queste variabili vengono azzerate a ogni ciclo
                        '*****************************************************************
                        'lettura file e salva i valori  in arraylist (M)
                        FileOpen(1, File, OpenMode.Input)
                        Do While Not EOF(1)
                            Riga = LineInput(1)
                            If Not String.IsNullOrWhiteSpace(Riga) Then
                                R = M.Add(Split(Riga, vbTab))
                                If NumColonna = -1 Then
                                    C = System.Array.IndexOf(M(R), NomeColonna)
                                    If C >= 0 Then NumColonna = C : Inizio = R + 1
                                End If
                                If System.Array.IndexOf(M(R), "Total") >= 0 Then Exit Do
                            End If
                        Loop
                        FileClose(1)
    
                        If NumColonna = -1 Then 'caso la colonna interessata non sia presente nel file, quindi termina..
                            MsgBox("Colonna  '" + NomeColonna + "'  non è stata trovata nel file report:" + _
                                vbCr + "'" + File + "'." + vbCr + vbCr + _
                                "Controllare che il nome della colonna da analizzare sia corretto", vbCritical, "ATTENZIONE!")
                        End If
                        '*********************************************************************
                        'Inserimento valori nel foglio della tabella preformattata in excel
                        For R = Inizio To M.Count - 1
                            .Cells(Misura, 1).value = "Misura " + (Misura - 1).ToString
                            If Not String.IsNullOrEmpty(M(R)(0)) Then
                                '2)----------system.array.indexOf ricerca l'elemento nel vettore e restituisce la posizione---------
                                C = System.Array.IndexOf(Tabella, M(R)(0).Trim) ' 
                                If C >= 0 Then ' se maggiore o = 0 allora è stato trovato trovato
                                    '-----------------------------------------------------------------------------------------------
                                    .Cells(Misura, C + 2).value = M(R)(NumColonna) ' quindi inserisce nel foglio
                                Else 'controllo opzionale:se l'elemento non esiste nella tabella, chiede di aggiungerlo automaticamente
                                    If MsgBox("Elemento:   ' " + M(R)(0) + " '   non esiste nella tabella-foglio di excel..." + vbCr + _
                                              vbCr + "Si vuole aggiungere adesso questo nuovo elemento alla tabella?", vbYesNo, _
                                              "File corrente: '" + File + "'") = vbYes Then
                                        C = UBound(Tabella) + 1 : ReDim Preserve Tabella(C) : Tabella(C) = M(R)(0)
                                        .Cells(1, C + 2).value = Tabella(C)
                                        .Cells(Misura, C + 2).value = M(R)(NumColonna)
                                    End If
                                End If
                            End If
                        Next R
                        .Rows(Misura + 1).select() ' avanza la selezione di una riga
                    Next File
                End With
            End If
        End Sub
    
    End Class



  • di Delp data: 24/02/2011

    Ciao mik, grazie per la nuova versione che proverò quanto prima..
    volevo chiederti l'ennesima cosa...
    una volta inseriti i valori, ho dato delle istruzioni per eliminare le colonne e le righe vuote; sono poi riuscito a posizionarmi sull'ultima cella piena (in pratica nell'angolo in basso a dx della tabella). esiste un modo per poter ottenere l'indirizzo di quella cella (che varia da caso a caso), così da poter selezionare l'intera tabella??
    grazie.



  • di Mik (utente non iscritto) data: 24/02/2011

    Se ho capito bene:

    .activecell

    restituisce la cella attiva. per sapere la riga e colonnna corrispondente:

    .activecell.row oppure .activecell.column

    se guardi l'ultima versione, inserisce in automatico le righe scrivendo anche la colonna "misura 1" "misura 2" , etc... quindi se prima dell'inserimento ripulisci tutte le righe poi te le ritrovi in automatico ogni volta che inserisce i valori
    e se ci fai caso, il programma è in grado di aggiungere automaticamente le colonne degli elementi man mano che le estrae dal file di testo ...magari togli la riga di msgbox (l'ultimo nel codice)... così eviti che ogni volta ti chiede conferma e va tutto in automatico praticamente con foglio totalmente ripulito ti ricrea tutto da zero...
    prova se ti va bene..ciao



  • di Mik (utente non iscritto) data: 24/02/2011

    Ho mascherato msgbox per non chiedere conferma..
     
    Public Class Form1
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim OpenFileDialog1 As New OpenFileDialog
            OpenFileDialog1.Multiselect = True
            If OpenFileDialog1.ShowDialog = System.Windows.Forms.DialogResult.OK Then
    
                Dim objXls As Microsoft.Office.Interop.Excel.Application
                objXls = New Microsoft.Office.Interop.Excel.Application
                objXls.Visible = True
                With objXls
                    .Workbooks.Open("D:UsersMikDocumentsElaborato Excel.xls")
    
                    Dim Riga As String = Nothing, M As New Collections.ArrayList, R As Long, NumColonna As Long, Inizio As Long
                    Dim C As Long = 2, Misura As Long = 2
                    Dim NomeColonna As String = "Conc"  '<<----Specificare qua il nome della colonna che contiene i valori da estrarre
    
                    '1)------ crea un vettore contenente tutti gli elementi presenti nella riga 1 del foglio di excel --------------
                    Do Until String.IsNullOrEmpty(.Cells(1, C).value)
                        If Not IsNothing(Riga) Then Riga += ";"
                        Riga += .Cells(1, C).value
                        C += 1
                    Loop
                    Dim Tabella() As String = Split(Riga, ";")
                    '------------------------------------------------------------------------------------------------------
                    ' se vi è almeno un'intera riga selezionata e > 1, allora utilizza la riga selezionata come posizione d'inserimento. 
                    If (.Selection.columns.count = .Columns.Count) And .Selection.Row > 1 Then Misura = .Selection.Row
                    .Rows(Misura).Select() ' riseleziona l'intera riga di riferimento 
    
                    For Each File In OpenFileDialog1.FileNames
                        Misura = .Selection.Row ' prende il riferimento riga dalla riga selezionata 
    
                        NumColonna = -1 : Inizio = 0 : M.Clear() ' queste variabili vengono azzerate a ogni ciclo
                        '*****************************************************************
                        'lettura file e salva i valori  in arraylist (M)
                        FileOpen(1, File, OpenMode.Input)
                        Do While Not EOF(1)
                            Riga = LineInput(1)
                            If Not String.IsNullOrWhiteSpace(Riga) Then
                                R = M.Add(Split(Riga, vbTab))
                                If NumColonna = -1 Then
                                    C = System.Array.IndexOf(M(R), NomeColonna)
                                    If C >= 0 Then NumColonna = C : Inizio = R + 1
                                End If
                                If System.Array.IndexOf(M(R), "Total") >= 0 Then Exit Do
                            End If
                        Loop
                        FileClose(1)
    
                        If NumColonna = -1 Then 'caso la colonna interessata non sia presente nel file, quindi termina..
                            MsgBox("Colonna  '" + NomeColonna + "'  non è stata trovata nel file report:" + _
                                vbCr + "'" + File + "'." + vbCr + vbCr + _
                                "Controllare che il nome della colonna da analizzare sia corretto", vbCritical, "ATTENZIONE!")
                        End If


  • ...segue
    di Mik (utente non iscritto) data: 24/02/2011

    .
     
                        '*********************************************************************
                        'Inserimento valori nel foglio della tabella preformattata in excel
                        For R = Inizio To M.Count - 1
                            .Cells(Misura, 1).value = "Misura " + (Misura - 1).ToString
                            If Not String.IsNullOrEmpty(M(R)(0)) Then
                                '2)----------system.array.indexOf ricerca l'elemento nel vettore e restituisce la posizione---------
                                C = System.Array.IndexOf(Tabella, M(R)(0).Trim) ' 
                                If C >= 0 Then ' se maggiore o = 0 allora è stato trovato trovato
                                    '-----------------------------------------------------------------------------------------------
                                    .Cells(Misura, C + 2).value = M(R)(NumColonna) ' quindi inserisce nel foglio
                                Else 'controllo opzionale:se l'elemento non esiste nella tabella, chiede di aggiungerlo automaticamente
                                    'If MsgBox("Elemento:   ' " + M(R)(0) + " '   non esiste nella tabella-foglio di excel..." + vbCr + _
                                    '          vbCr + "Si vuole aggiungere adesso questo nuovo elemento alla tabella?", vbYesNo, _
                                    '          "File corrente: '" + File + "'") = vbYes Then
                                    C = UBound(Tabella) + 1 : ReDim Preserve Tabella(C) : Tabella(C) = M(R)(0)
                                    .Cells(1, C + 2).value = Tabella(C)
                                    .Cells(Misura, C + 2).value = M(R)(NumColonna)
                                    'End If
                                End If
                            End If
                        Next R
                        .Rows(Misura + 1).select() ' avanza la selezione di una riga
                    Next File
    
                End With
            End If
        End Sub
    
    End Class



  • di Delp data: 08/03/2011

    Ciao mik,
    scusa per il lungo silenzio, ma è stato un periodo caotico.. ho provato questa nuova macro che mi hai spedito, ma delle volte non inserisce alcuni elementi (ho fatto un po' di prove). ad ogni modo non fa nulla, userò il vecchio codice che va benissimo (la lentezza,tra l'altro non eccessiva, non è per me un problema).
    visto che ci sono voglio chiederti una cosa. sto cercando di salvare la tabella creata con il metodo .activeworkbook.saveas, e nonostante nella finestra di dialogo mi compare il path desiderato, mi salva il file in documenti. sai perchè?
    ti posto il codice.
    come al solito, grazie infinite.
     
    SaveFileDialog1.Filter = "File di Excel 97-2003|*.xls|Tutti i Files|*.*"
                SaveFileDialog1.FileName = "Tabella Excel"
                SaveFileDialog1.Title = "Salva Tabella"
                SaveFileDialog1.RestoreDirectory = True
                SaveFileDialog1.ValidateNames = True
                SaveFileDialog1.CheckPathExists = False
                SaveFileDialog1.DereferenceLinks = True
                If SaveFileDialog1.ShowDialog = System.Windows.Forms.DialogResult.OK Then
                    .ActiveWorkbook.SaveAs(Filename:="Tabella Excel", FileFormat:=XlFileFormat.xlWorkbookNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
                CreateBackup:=False)
    
                ElseIf SaveFileDialog1.ShowDialog = System.Windows.Forms.DialogResult.Cancel Then
                    .ActiveWorkbook.Close(SaveChanges:=False)
                    .Application.Quit()
                    ProgressBar1.Value = 15
                    Label1.Text = "Creazione tabella abortita!"
                    Exit Sub
                End If



  • di Mik (utente non iscritto) data: 12/03/2011

    Ti rispondo al volo,

    secondo me l'errore è nei paramentri della riga che ti ho postato sotto:
    e precisamente assegni
    filename:="tabella excel"

    dovresti invece assegnarli il filenames della finestra di dialogo.

    ciao

     
                    .ActiveWorkbook.SaveAs(Filename:="Tabella Excel", FileFormat:=XlFileFormat.xlWorkbookNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
                CreateBackup:=False)



  • di Delp (utente non iscritto) data: 14/03/2011

    Grazie mik, come sempre sei stato preziosissimo..
    ho sostituito come vedi nel codice qui sotto e tutto va a meraviglia..
    grazie di nuovo!!
     
     .ActiveWorkbook.SaveAs(SaveFileDialog1.FileName)